#include <stdio.h>
#include <omp.h>
int main(void)
{
    omp_set_nested(1);
    omp_set_dynamic(0);
    #pragma omp parallel
    {
        #pragma omp parallel
        {
            #pragma omp single
            {
                /*
                 * 当设置 OMP_NUM_THREADS=2,3（外层2线程/内层3线程）时，程序将输出：
                 * Inner: num_thds=3 （内层区域3个线程）
                 * Inner: num_thds=3 （每个外层线程生成3个内层线程）
                 * 若系统不支持嵌套并行，则输出结果为：
                 * Inner: num_thds=1 （内层区域退化为单线程）
                 * Inner: num_thds=1 （每个外层线程的内层区域仅1个线程）
                 */
                printf("Inner: num_thds=%d\n", omp_get_num_threads());
            }
        }
        #pragma omp barrier
        omp_set_nested(0);
        #pragma omp parallel
        {
            #pragma omp single
            {
                /*
                 * 即使设置了 OMP_NUM_THREADS=2,3（外层2线程/内层3线程），由于禁用了嵌套并行，
                 * 程序仍会输出：
                 * Inner: num_thds=1
                 * Inner: num_thds=1
                 */
                printf("Inner: num_thds=%d\n", omp_get_num_threads());
            }
        }
        #pragma omp barrier
        #pragma omp single
        {
            /*
             * 若设置 OMP_NUM_THREADS=2,3（2个外层线程/3个内层线程），程序将输出：
             * Outer: num_thds=2
             */
            printf("Outer: num_thds=%d\n", omp_get_num_threads());
        }
    }
    return 0;
}
